deployment/apim-policies/Logins the user.xml (139 lines of code) (raw):

<policies> <inbound> <base /> <send-request mode="copy" response-variable-name="loginResponse"> <set-url>{{identityServerBaseUrl}}/connect/token</set-url> <set-method>POST</set-method> <set-header name="Content-Type" exists-action="override"> <value>application/x-www-form-urlencoded</value> </set-header> <set-body>@{ var requestBody = context.Request.Body.As<JObject>(preserveContent: true); var username = requestBody["username"]; var password = requestBody["password"]; return $"grant_type=password&scope={{scope}}&client_id={{clientId}}&username={username ?? string.Empty}&password={password ?? string.Empty}"; }</set-body> </send-request> <choose> <when condition="@(((IResponse)context.Variables["loginResponse"]).StatusCode != 200)"> <return-response response-variable-name="loginResponse"> <set-body>@{ var loginResponseObject = ((IResponse)context.Variables["loginResponse"]).Body.As<JObject>(preserveContent: true); char separator = '_'; var errorTarget = (loginResponseObject["error"] == null) ? string.Empty : loginResponseObject["error"].ToString().ToLower(); string errorTargetResult = "UnknownLoginError"; if (!string.IsNullOrWhiteSpace(errorTarget)) { errorTargetResult = string.Join(string.Empty, errorTarget.Split(separator) .Select(word => char.ToUpper(word[0]) + word.Substring(1))); } var errorDescription = (loginResponseObject["error_description"] == null) ? string.Empty : loginResponseObject["error_description"].ToString().ToLower(); string errorDescriptionResult = "Unknown error."; if (!string.IsNullOrWhiteSpace(errorDescription)) { errorDescriptionResult = string.Join(" ", errorDescription.Split(separator) .Select((word, i) => i == 0 ? char.ToUpper(word[0]) + word.Substring(1) : word)) + "."; } return new JObject( new JProperty("errorCode", ((IResponse)context.Variables["loginResponse"]).StatusCode.ToString()), new JProperty("errors", new JArray(new JObject( new JProperty("errorTarget", errorTargetResult), new JProperty("description", errorDescriptionResult)))) ).ToString(); }</set-body> </return-response> </when> </choose> <set-variable name="accessToken" value="@(((IResponse)context.Variables["loginResponse"]).Body.As<JObject>(preserveContent: true)["access_token"].ToString())" /> <send-request mode="new" response-variable-name="introspectResponse"> <set-url>{{identityServerBaseUrl}}/connect/introspect</set-url> <set-method>POST</set-method> <set-header name="Authorization" exists-action="override"> <value>@($"Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes("{{apiClientId}}:{{apiClientSecret}}")))</value> </set-header> <set-header name="Content-Type" exists-action="override"> <value>application/x-www-form-urlencoded</value> </set-header> <set-body>@($"token={context.Variables["accessToken"]}")</set-body> </send-request> <choose> <when condition="@(((IResponse)context.Variables["introspectResponse"]).StatusCode != 200)"> <return-response response-variable-name="introspectResponse"> <set-body>@{ var introspectResponseObject = ((IResponse)context.Variables["introspectResponse"]).Body.As<JObject>(preserveContent: true); char separator = '_'; var errorTarget = (introspectResponseObject["error"] == null) ? string.Empty : introspectResponseObject["error"].ToString().ToLower(); string errorTargetResult = "UnknownIntrospectError"; if (!string.IsNullOrWhiteSpace(errorTarget)) { errorTargetResult = string.Join(string.Empty, errorTarget.Split(separator) .Select(word => char.ToUpper(word[0]) + word.Substring(1))); } var errorDescription = (introspectResponseObject["error_description"] == null) ? string.Empty : introspectResponseObject["error_description"].ToString().ToLower(); string errorDescriptionResult = "Unknown error."; if (!string.IsNullOrWhiteSpace(errorDescription)) { errorDescriptionResult = string.Join(" ", errorDescription.Split(separator) .Select((word, i) => i == 0 ? char.ToUpper(word[0]) + word.Substring(1) : word)) + "."; } return new JObject( new JProperty("errorCode", ((IResponse)context.Variables["introspectResponse"]).StatusCode.ToString()), new JProperty("errors", new JArray(new JObject( new JProperty("errorTarget", errorTargetResult), new JProperty("description", errorDescriptionResult)))) ).ToString(); }</set-body> </return-response> </when> </choose> <set-backend-service base-url="{{userApiBaseUrl}}" /> <rewrite-uri template="/api/v1/user/profile" /> <set-method>GET</set-method> <set-header name="Authorization" exists-action="override"> <value>@($"Bearer {(string)context.Variables["accessToken"]}")</value> </set-header> </inbound> <backend> <base /> </backend> <outbound> <base /> <choose> <when condition="@(context.Response.StatusCode == 200)"> <set-body>@{ var introspectResponseObject = ((IResponse)context.Variables["introspectResponse"]).Body.As<JObject>(preserveContent: true); var loginResponseObject = ((IResponse)context.Variables["loginResponse"]).Body.As<JObject>(preserveContent: true); var profileResponseObject = context.Response.Body.As<JObject>(preserveContent: true); return new JObject( new JProperty("userToken", introspectResponseObject["sub"]), new JProperty("token", new JObject( new JProperty("accessToken", loginResponseObject["access_token"]), new JProperty("refreshToken", loginResponseObject["refresh_token"]), new JProperty("expiresIn", loginResponseObject["expires_in"]) )), new JProperty("userProfile", profileResponseObject["userProfile"]), new JProperty("metadata", profileResponseObject["metadata"]) ).ToString(); }</set-body> </when> </choose> </outbound> <on-error> <return-response> <set-status code="@(context.Response.StatusCode)" reason="@(context.Response.StatusReason)" /> <set-header name="Content-Type" exists-action="override"> <value>application/json</value> </set-header> <set-body>@{ return new JObject( new JProperty("errorCode", context.Response.StatusCode.ToString()), new JProperty("errors", new JArray(new JObject( new JProperty("errorTarget", context.LastError.Reason), new JProperty("description", context.LastError.Message)))) ).ToString(); }</set-body> </return-response> <base /> </on-error> </policies>